#include "arc.h"

void arc_create(Arc** arc, Noeud *predecesseur, Noeud *successeur, int cost)
{
    (*arc) = (Arc*) malloc(sizeof(Arc));
    arc_initialize((*arc),predecesseur,successeur,cost);
}

void arc_initialize(Arc* arc, Noeud* predecesseur, Noeud* successeur, int cost)
{
    arc->predecesseur = predecesseur;
    arc->successeur = successeur;
    arc->cost = cost;
}

void arc_copy(const Arc* arc, Arc* ret)
{
    if(ret != NULL)
        arc_clear(ret);
    noeud_create(&ret->predecesseur,"");
    noeud_create(&ret->successeur, "");
    noeud_copy(arc->predecesseur, ret->predecesseur);
    noeud_copy(arc->successeur, ret->successeur);
    ret->cost = arc->cost;
}

void arc_clear(Arc* arc)
{
    if(arc != NULL)
    {
        noeud_clear(arc->predecesseur);
        noeud_clear(arc->successeur);
        arc->cost = 0;
    }
}

void arc_destroy(Arc** arc)
{
    arc_clear((*arc));
    free((*arc));
    (*arc) = NULL;
}

int arc_equals(const Arc* a, const Arc* b)
{
    if ( noeud_equals(a->predecesseur,b->predecesseur) &&
         noeud_equals(a->successeur,b->successeur) &&
         (a->cost == b->cost))
        return 1;
    else
        return 0;
}

Object* object_getArc()
{
    object_initialize(&_object_Arc,
                      _arc_toString,
                      _arc_equals,
                      _arc_copy,
                      _arc_create,
                      _arc_initialize,
                      _arc_clear,
                      _arc_destroy);
    return &_object_Arc;
}

void _arc_toString(const void* value, int fd)
{
    char buf[80];
    int size = sprintf(buf,"Arc");
    write(fd,buf,size);
}

int _arc_equals(const void* value, const void* operande)
{
    return arc_equals((const Arc*)value,(const Arc*) operande);
}

int _arc_copy(const void* value, void* ret)
{
    arc_copy((Arc*)value,(Arc*)ret);
    return 1;
}

int _arc_create(void** value, void* args)
{
    arc_create((Arc**)value,NULL,NULL,0);
    return 1;
}

int _arc_initialize(void* value, void* args)
{
    arc_initialize((Arc*)value,NULL,NULL,0);
    return 1;
}

void _arc_destroy(void** value)
{
    arc_destroy((Arc**)value);
}

void _arc_clear(void* value)
{
    arc_clear((Arc*)value);
}
